home *** CD-ROM | disk | FTP | other *** search
/ Atari Mega Archive 2 / Atari Mega Archive CD - Volume 2.iso / 8bit / cislib_b / relgen2.act < prev    next >
Text File  |  1995-04-22  |  6KB  |  313 lines

  1. MODULE ;RELGEN.ACT 
  2.  
  3. ;COPYRIGHT 1984, QMI, JS DeMar 
  4. ;REV. 1.1, March 20, 1984 
  5.  
  6. ;OBJECT CODE RELOCATION GENERATOR for 
  7. ;ACTION! compiled binary-load files. 
  8.  
  9. ;WARNING!!! This program requires 
  10. ;four OPEN files simultaneously. 
  11. ;Be sure that DOS is configured for 
  12. ;this. With DOS 2.0, set $709 equal 
  13. ;to at least 4, rewrite DOS and 
  14. ;reboot. 
  15.  
  16. ;Requires the second file compiled 
  17. ;at any even page increment higher 
  18. ;than the first file, for example: 
  19. ;$3000 and $3100. 
  20.  
  21. ;Generates a table of the locations 
  22. ;that require relocating and saves 
  23. ;it in a ".GEN" file in ACTION!. 
  24. ;  The ".REL" file is the original 
  25. ;object code with an origin of "0".  
  26. ;The actual relocator is compiled 
  27. ;from the generic relocator source 
  28. ;called "RELOC.ACT" merged with the 
  29. ;".GEN" file generated here. Append 
  30. ;".REL" file to that code and it 
  31. ;will load and relocate to MEMLO. 
  32.  
  33. DEFINE in1="1", 
  34.        in2="2", 
  35.        out1="3", 
  36.        out2="4" 
  37.  
  38. BYTE abrt 
  39.  
  40. ;--------------------------------- 
  41.  
  42. PROC MyError(BYTE a,x,y) 
  43.  
  44. IF y=170 THEN 
  45.   PrintE("ERROR File not found!") 
  46. ELSE 
  47.   Print("ERROR! ") 
  48.   PrintBE(y) 
  49. FI 
  50. abrt=1 
  51. RETURN 
  52. ;--------------------------------- 
  53.  
  54. PROC Ferror() 
  55.  
  56. BYTE t,clock=$14 
  57.  
  58. PrintE("ERROR in Output filespec!") 
  59. t=clock-$80 
  60. DO 
  61. UNTIL t=clock 
  62. OD 
  63. RETURN 
  64. ;--------------------------------- 
  65.  
  66. PROC Main() 
  67.  
  68. CARD start1,start2,end1,end2 
  69. CARD offsets,offsete,i,count,hits 
  70. CARD test1,test2,old1,old2,old3,old0 
  71. BYTE x,z,j,wnum,d1,d2, 
  72.      sthigh 
  73.  
  74. BYTE ARRAY fname1(18),fname2(18), 
  75.            fnameout1(18),fnameout2(18) 
  76.  
  77. DO 
  78. Put(125) 
  79. PrintE("     Relocation Code Generator ") 
  80. PrintE("           JS DeMar 3/84 ") 
  81. PutE() 
  82. PrintE("  Requires two code files compiled") 
  83. PrintE("      with an offset of $0100.") 
  84. PutE() 
  85.  
  86. Print("Filespec for code A >")  
  87. InputMD(device,fname1,18) 
  88. PutE() 
  89. Print("Filespec for code B >")  
  90. InputMD(device,fname2,18) 
  91. PutE() 
  92.  
  93. Scopy(fnameout1,fname1) 
  94. SCopy(fnameout2,fnameout1) 
  95. j=1 
  96. IF fnameout1(1)#'D  
  97.       OR fnameout1(0)<4 THEN 
  98.   Ferror() 
  99. ELSEIF fnameout1(2)=': THEN 
  100.   z=0 
  101. ELSEIF fnameout1(3)=': THEN 
  102.   z=1 
  103. FI 
  104. DO  
  105.   x=fnameout1(j) 
  106.   j==+1 
  107.   IF x=$20 THEN 
  108.     EXIT 
  109.   ELSEIF x='. THEN 
  110.     EXIT 
  111.   ELSEIF j>fnameout1(0) THEN 
  112.     j==+1 
  113.     EXIT 
  114.   ELSEIF j>11+z THEN 
  115.     Ferror() 
  116.   FI 
  117. OD 
  118.  
  119. fnameout1(j-1)='. 
  120. fnameout1(j)='G 
  121. fnameout1(j+1)='E 
  122. fnameout1(j+2)='N 
  123. fnameout1(0)=j+2 
  124.  
  125. j=1 
  126. IF fnameout2(1)#'D  
  127.       OR fnameout2(0)<4 THEN 
  128.   Ferror() 
  129. ELSEIF fnameout2(2)=': THEN 
  130.   z=0 
  131.   EXIT 
  132. ELSEIF fnameout2(3)=': THEN 
  133.   z=1 
  134.   EXIT 
  135. FI 
  136. OD 
  137. DO  
  138.   x=fnameout2(j) 
  139.   j==+1 
  140.   IF x=$20 THEN 
  141.     EXIT 
  142.   ELSEIF x='. THEN 
  143.     EXIT 
  144.   ELSEIF j>fnameout2(0) THEN 
  145.     j==+1 
  146.     EXIT 
  147.   ELSEIF j>11+z THEN 
  148.     Ferror() 
  149.     EXIT 
  150.   FI 
  151. OD 
  152.  
  153. fnameout2(j-1)='. 
  154. fnameout2(j)='R 
  155. fnameout2(j+1)='E 
  156. fnameout2(j+2)='L 
  157. fnameout2(0)=j+2 
  158.  
  159. Print("Generation file = ") 
  160. PrintE(fnameout1) 
  161. Print("Relocation file = ") 
  162. PrintE(fnameout2) 
  163.  
  164. Error=MyError 
  165. abrt=0 
  166. Close(in1) 
  167. Close(in2) 
  168. Close(out1) 
  169. Close(out2) 
  170. Open(in1,fname1,4) 
  171. Open(in2,fname2,4) 
  172. IF abrt=1 THEN  
  173.   Close(1) 
  174.   Close(2) 
  175.   RETURN 
  176. FI 
  177. Open(out1,fnameout1,8) 
  178. Open(out2,fnameout2,8) 
  179.  
  180. x=GetD(in1) ;throw away two $FF's. 
  181. x=GetD(in1) 
  182. PutD(out2,$FF) 
  183. PutD(out2,$FF) 
  184. x=GetD(in1) 
  185. PutD(out2,x) 
  186. start1=x    ;start addr of file1. 
  187. x=GetD(in1) 
  188. PutD(out2,x) 
  189. start1==+(x*256) 
  190. x=GetD(in1) 
  191. PutD(out2,x) 
  192. end1=x 
  193. x=GetD(in1) 
  194. PutD(out2,x) 
  195. end1==+(x*256) ;end addr of file1. 
  196.  
  197. x=GetD(in2) ;throw away two $FF's. 
  198. x=GetD(in2) 
  199. x=GetD(in2) 
  200. start2=x    ;start addr of file2. 
  201. x=GetD(in2) 
  202. start2==+(x*256) 
  203. x=GetD(in2) 
  204. end2=x 
  205. x=GetD(in2) 
  206. end2==+(x*256) ;end addr of file2. 
  207.  
  208. offsets=start2-start1 
  209. sthigh=start1/256 
  210. offsete=end2-end1 
  211.  
  212.  
  213. PrintDE(out1,"MODULE") 
  214. PrintD(out1,";For file ") 
  215. PrintDE(out1,fnameout2) 
  216. PrintDE(out1,"") 
  217. Print("Code starts at ") 
  218. PrintD(out1,"CARD start=[") 
  219. PrintCE(start1) 
  220. PrintCD(out1,start1) 
  221. PrintDE(out1,"]") 
  222. Print("   and ends at ") 
  223. PrintD(out1,"CARD finish=[") 
  224. PrintCE(end1) 
  225. PrintCD(out1,end1) 
  226. PrintDE(out1,"]") 
  227. Print("Compile offset was ") 
  228. PrintCE(offsets) 
  229.  
  230. IF offsete#offsets THEN 
  231.   PrintE("Diferrent size files!") 
  232.   PrintE("ABORTED!") 
  233. ELSE 
  234.   PrintDE(out1,"") 
  235.   PrintD(out1,"CARD ARRAY otable=[") 
  236.   wnum=0 
  237.   hits=0 
  238.   count=0 
  239.   WHILE EOF(in1)=0  
  240.   DO 
  241.     d1=GetD(in1) 
  242.     d2=GetD(in2) 
  243.     IF d1#d2 THEN 
  244.       IF count<(end1-start1)-5 THEN 
  245.         hits==+1 
  246.         IF wnum=0 THEN 
  247.           PrintD(out1,"  ") 
  248.           Print(" ") 
  249.         ElSE  
  250.           PrintD(out1," ") 
  251.           Print(" ") 
  252.         FI 
  253.         PrintCD(out1,count) 
  254.         Print(" ") 
  255.         PrintC(count) 
  256.         wnum==+1 
  257.         IF wnum>4 THEN 
  258.           PrintDE(out1,"") 
  259.           PrintE("") 
  260.           wnum=0 
  261.         FI 
  262.       FI 
  263.       old0=d1 
  264.       test1=old0*256 
  265.       test1==+old1 
  266.       test2=old2*256 
  267.       test2==+old3 
  268.       IF test1>=start1 AND test1<=end1 THEN 
  269.         IF test2=$02E3 OR test2=$02E1 THEN 
  270.           PrintDE(out1,"]") 
  271.           PrintE("]") 
  272.           PrintD(out1,"CARD hits=[") 
  273.           PrintCD(out1,hits) 
  274.           PrintDE(out1,"]") 
  275.           PrintDE(out1,"") 
  276.           Print("CARD hits=[") 
  277.           PrintC(hits) 
  278.           PrintE("]") 
  279.           PrintE("") 
  280.           PrintD(out1,"CARD runaddr=[") 
  281.           Print("CARD runaddr=[") 
  282.           test1==-start1 
  283.           PrintCD(out1,test1) 
  284.           PrintC(test1) 
  285.           PrintDE(out1,"]") 
  286.           PrintE("]") 
  287.           wnum=0 
  288.         FI 
  289.       FI 
  290.       old3=old2 
  291.       old2=old1 
  292.       old1=d1 
  293.       d1==-sthigh 
  294.     ELSE  
  295.       old3=old2 
  296.       old2=old1 
  297.       old1=d1 
  298.     FI 
  299.     PutD(out2,d1) 
  300.     count==+1 
  301.   OD 
  302. FI 
  303. PrintE("") 
  304. PrintDE(out1,"") 
  305. Close(in1) 
  306. Close(in2) 
  307. Close(out1) 
  308. Close(out2) 
  309. PrintE("Finished!") 
  310. RETURN 
  311.  
  312.  
  313. xxxxxxxx